﻿// 0724_parking.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <vector>
#include <stack>
#include <map>
#include <string>
using namespace std;

class ParkingSystem
{
public:
    // [[1, 1, 0], [1], [2], [3], [1]]
    // 大1 中2 小3
    vector<int>park_vec;
    ParkingSystem(int big, int medium, int small)
    {
        park_vec = { 0, big, medium, small };
    }

    bool checkCar(int car_type)
    {
        return park_vec[car_type] > 0;
    }

    bool addCar(int car_type)
    {
        if (!checkCar(car_type)) return false;
        int value = park_vec[car_type];
        park_vec[car_type] = value - 1;
        return true;
    }
};

void solve(string input)
{
    map<char, char>oh_map = { {'(',')'},{'[',']'},{'{','}'} };
    stack<char>oh_st;
    bool is_error = false;
    int result = 0;
    if (input.size() % 2 != 0)
    {
        //字符串无效
        is_error = true;
    }

    int curr = 0;
    for (auto& s_char : input)
    {
        if (s_char == '(' || s_char == '[' || s_char == '{')
        {
            oh_st.push(oh_map[s_char]);
            curr++;
            result = max(curr, result);
        }
        else {
            if (oh_st.empty())
            {
                //先出现右括号，不合法
                is_error = true;
                break;
            }

            char top = oh_st.top();
            oh_st.pop();
            curr--;
            if (s_char != top)
            {
                is_error = true;
                break;
            }

        }
    }

    if (!oh_st.empty()) is_error = true;

    if (is_error)
    {
        cout << 0;
    }
    else {
        cout << result;
    }
}

int main()
{
    string input;
    getline(cin, input);
    solve(input);

    //ParkingSystem parkingSystem(1, 1, 0);
    //cout << parkingSystem.addCar(1); // 返回 true ，因为有 1 个空的大车位
    //cout << parkingSystem.addCar(2); // 返回 true ，因为有 1 个空的中车位
    //cout << parkingSystem.addCar(3); // 返回 false ，因为没有空的小车位
    //cout << parkingSystem.addCar(1); // 返回 false ，因为没有空的大车位，唯一一个大车位已经被占据了
}

// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单

// 入门使用技巧: 
//   1. 使用解决方案资源管理器窗口添加/管理文件
//   2. 使用团队资源管理器窗口连接到源代码管理
//   3. 使用输出窗口查看生成输出和其他消息
//   4. 使用错误列表窗口查看错误
//   5. 转到“项目”>“添加新项”以创建新的代码文件，或转到“项目”>“添加现有项”以将现有代码文件添加到项目
//   6. 将来，若要再次打开此项目，请转到“文件”>“打开”>“项目”并选择 .sln 文件
